﻿package zf.data.ds
{
	/**
	 * 队列, 数据将从队列尾进入，从队列头出去，先进先出
	 * @author Mike.zhang
	 * @langversion 3.0 
	 * @playerversion Flash 9 
	 * 
	 * @see Stack
	 * 
	 */
	public class Queue implements ILinkedList
	{
		private var _list:SLinkedList;
		/**
		 * 创建一个队列 
		 * @param list 要创建队列的 SLinkedList
		 * @see SLinkedList
		 *  
		 */
		public function Queue (list:SLinkedList=null)
		{
			if (list == null)
			{
				_list=new SLinkedList  ;
			}
			else
			{
				_list=list;
			}
		}
		/**
		 * 队列长度，总计的节点个数 
		 * @return 长度
		 * 
		 */
		public function get length ():uint
		{
			return 0;
		}
		/**
		 * 检测队列是否为空 
		 * @return 空为true
		 * 
		 */
		public function isEmpty ():Boolean
		{
			return _list.isEmpty();
		}
		/**
		 * 将队列转化为数组 
		 * @return 数组
		 * 
		 */
		public function toArray ():Array
		{
			return _list.toArray();
		}
		/**
		 * 清除队列中所有节点，使队列为空 
		 * 
		 */
		public function clear ():void
		{
			_list.clear ();
		}
		/**
		 * 检查队列中是否包含指定的数据 
		 * @param obj 要检查的数据
		 * @return 如果有返回true
		 * 
		 */
		public function contains (obj:*):Boolean
		{
			return _list.contains(obj);
		}
		/**
		 * 查看队列头数据 
		 * @return 头数据
		 * 
		 */
		public function peek ():*
		{
			return _list.length > 0?_list.head:null;
		}
		/**
		 * 查看队列尾数据 
		 * @return 尾数据
		 * 
		 */
		public function back ():*
		{
			return _list.length > 0?_list.tail:null;
		}
		/**
		 * 入列，将数据压入队列尾 
		 * @param obj 要进入队列的数据
		 * 
		 */
		public function enqueue (obj:*):void
		{
			_list.append (obj);
		}
		/**
		 * 出列，将队列头数据弹出 
		 * @return 队列头的数据
		 * 
		 */
		public function dequeue ():*
		{
			return _list.removeHead();
		}
		/**
		 * 返回队列的描述信息 
		 * @return 格式[Queue SLinkedList]
		 * 
		 */
		public function toString ():String
		{
			return "[Queue " + _list.toString() + "]";
		}
	}
}